/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.edu.flf.audioteca.dao.impl;

import java.io.Serializable;

import org.apache.commons.beanutils.BeanUtils;

import br.edu.flf.audioteca.dao.IEntidadeEscritaDAO;
import br.edu.flf.audioteca.dao.exceptions.JPAException;

/**
 *
 * @author Nathan Azevedo
 */
public class EntidadeEscritaDAO extends EntidadeLeituraDAO implements IEntidadeEscritaDAO {

    public <S extends Serializable> S incluir(final S entidade) throws JPAException {
        javax.persistence.EntityManager em = null;
        S retorno = null;
        try {

            retorno = (S) BeanUtils.cloneBean(entidade);
            em = getEntityManager();
            em.getTransaction().begin();
            em.persist(retorno);
            em.getTransaction().commit();

        } catch (Exception ex) {

            ex.printStackTrace();
            if (em.getTransaction().isActive()) {
                em.getTransaction().rollback();
            }

            throw new JPAException(ex, "Erro ao incluir nova entidade.");
            

        } finally {
            if (em != null) {
                em.close();
            }

        }
        return retorno;
    }

    public <S extends Serializable> S alterar(final S entidade) throws JPAException {
        javax.persistence.EntityManager em = null;
        S retorno = null;
        try {

            retorno = (S) BeanUtils.cloneBean(entidade);
            em = getEntityManager();
            em.getTransaction().begin();
            retorno = em.merge(retorno);
            em.getTransaction().commit();
        } catch (Exception ex) {
            ex.printStackTrace();
            if (em.getTransaction().isActive()) {
                em.getTransaction().rollback();
            }
            throw new JPAException(ex, "Erro ao alterar entidade.");

        } finally {
            if (em != null) {
                em.close();
            }
        }
        return retorno;
    }

    public <S extends Serializable> S excluir(final S entidade) throws JPAException {
        javax.persistence.EntityManager em = null;
        S retorno = null;
        try {

            retorno = (S) BeanUtils.cloneBean(entidade);
            em = getEntityManager();
            em.getTransaction().begin();
            em.remove(em.merge(retorno));
            em.getTransaction().commit();
        } catch (Exception ex) {
            ex.printStackTrace();
            if (em.getTransaction().isActive()) {
                em.getTransaction().rollback();
            }

            throw new JPAException(ex, "Erro ao excluir entidade.");

        } finally {
            if (em != null) {
                em.close();
            }
        }
        return retorno;
    }
}
